使用QUIC监听兼容HTTP/3协议提高网络通信性能

在不稳定且多变的网络环境中(如移动网络),或在需要低延迟的场景下(如网络游戏或流媒体服务),您可以使用QUIC监听兼容HTTP/3协议以提高网络通信性能。

工作原理

基于UDP的QUIC协议是HTTP/3的核心,具有多路复用、0-RTT握手、高效拥塞控制算法、无缝链接迁移等多种改进。相较于使用TLS+TCP的HTTP/2,基于QUIC的HTTP/3能显著减少数据重传和通信延迟,从而提高网络通信性能。关于QUIC的更多信息,请参考QUIC官方文档

QUIC监听可以单独使用,也支持与HTTPS监听联合使用,这两种使用方法的区别如下:

  • 单独使用QUIC监听:在创建QUIC监听后,ALB实例支持客户端使用HTTP/3协议访问服务。但是不支持更早的HTTP协议(如HTTP/2)。

  • 联合使用QUIC与HTTPS监听:如果部分客户端需要使用HTTP/1.1或HTTP/2访问服务,联合使用两种监听可以保证对多种HTTP协议的兼容。在联合使用两种监听时,ALB实例的工作模式如下图所示。QUIC监听与HTTPS监听同时监听同一个端口,并且使用相同的一组转发规则。在接收客户端访问请求时,ALB实例会优先使用QUIC监听将请求转发至后端服务。而当客户端不支持HTTP/3协议时,ALB实例会通过HTTPS监听进行转发。

    image

配置QUIC监听

联合使用QUIC监听与HTTPS监听

前提条件

步骤一:在AlbConfig中创建QUIC监听

  1. 执行以下命令编辑AlbConfig。

    kubectl edit albconfig <ALBCONFIG_NAME> # <ALBCONFIG_NAME>替换AlbConfig的名称
  2. 创建QUIC监听,同时在HTTPS监听中添加quicConfig字段。

    apiVersion: alibabacloud.com/v1
    kind: AlbConfig
    metadata:
      name: #...
    spec:
      config:
        #...
      listeners:
        - port: 443
          protocol: HTTPS
          certificates:
          - CertificateId: 756****-cn-hangzhou # 证书的CertIdentifier
            IsDefault: true
          quicConfig:
            quicListenerId: "" # 目前置空,在下一步中会填入值
            quicUpgradeEnabled: false # 设为false
        - port: 443
          protocol: QUIC # QUIC监听
          certificates:
          - CertificateId: 756****-cn-hangzhou # 与HTTPS的证书保持一致
            IsDefault: true 
    重要

    以上示例使用了AlbConfig指定证书的配置方法。QUIC监听同样支持使用自动发现证书或Secret证书。具体操作,请参见配置HTTPS证书以实现加密通信

步骤二:在Ingress中添加注解

您需要在Ingress资源中添加注解,以保证Ingress同时适用于多个监听。

  1. 执行以下命令,编辑Ingress。

    kubectl edit ingress <INGRESS_NAME> # <INGRESS_NAME>替换为Ingress的名称
  2. 在Ingress中的annotations字段添加内容。

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: #...
      annotations:
        alb.ingress.kubernetes.io/listen-ports: '[{"QUIC": 443},{"HTTPS": 443}]' # 使Ingress同时适用于QUIC和HTTPS监听
    spec:
      #...

步骤三:关联监听

  1. 登录应用型负载均衡ALB控制台

  2. 实例页面,单击目标ALB实例ID。在监听页签,查找监听协议/端口为QUIC:443的监听,记录此监听的ID。

  3. 在AlbConfig中填入QUIC监听的ID。

    1. 执行以下命令编辑AlbConfig。

      kubectl edit albconfig <ALBCONFIG_NAME> # <ALBCONFIG_NAME>替换AlbConfig的名称
    2. 在HTTPS监听的quicListenerId字段中填入QUIC监听的ID,并将quicUpgradeEnabled字段的值修改为true

      apiVersion: alibabacloud.com/v1
      kind: AlbConfig
      metadata:
        name: #...
      spec:
        config:
          #...
        listeners:
          - port: 443
            protocol: HTTPS
            certificates:
            - CertificateId: 756****-cn-hangzhou
              IsDefault: true 
            quicConfig: 
              quicListenerId: lsn-tnz740dr8p5h65**** # 具体QUIC监听listener ID。
              quicUpgradeEnabled: true # 修改为true
          - port: 443
            protocol: QUIC # QUIC监听
            certificates:
            - CertificateId: 756****-cn-hangzhou
              IsDefault: true 
  4. 确认监听已关联

    1. 登录应用型负载均衡ALB控制台

    2. 实例页面,单击目标实例ID,然后在实例详情页面,单击监听页签,最后在监听列表,单击目标HTTPS监听名称,在监听详情页签查看已关联的QUIC监听。

步骤四:效果验证

使用HTTP/3协议通过ALB Ingress访问服务,验证配置的效果。

  1. 执行以下命令,查看Ingress信息。

    kubectl get ingress

    预期输出:

    NAME            CLASS                HOSTS                  ADDRESS                         PORTS     AGE
    https-ingress   https-ingressclass   demo.alb.ingress.top   alb-********.alb.aliyuncs.com   80, 443   83m

    记录下HOSTSADDRESS部分的值,以便后续步骤使用。

  2. 执行以下命令,分别使用HTTP/3与传统的HTTPS访问服务。其中的demo.alb.ingress.topalb-********.alb.aliyuncs.com请替换为在上一步中得到的值。

    说明

    一部分curl版本并不默认支持HTTP/3协议,请确保您的curl支持HTTP/3。

    curl --http3 -H HOST:demo.alb.ingress.top -k https://alb-********.alb.aliyuncs.com
    curl -H HOST:demo.alb.ingress.top -k https://alb-********.alb.aliyuncs.com

    预期输出如下,则表明两种监听关联成功,兼容多种HTTP协议:

    old
    old

(可选)步骤五:解除关联

  1. 执行以下命令编辑AlbConfig。

    kubectl edit albconfig <ALBCONFIG_NAME> # <ALBCONFIG_NAME>替换AlbConfig的名称
  2. quicListenerId字段置空,并将quicUpgradeEnabled字段的值修改为false,然后保存并退出。

    # 以上内容省略。
        port: 443
        protocol: HTTPS
        quicConfig:
          quicListenerId: "" # 将QUIC监听listener ID置空。
          quicUpgradeEnabled: false # 修改为false
        requestTimeout: 0
    # 以下内容省略。

单独使用QUIC监听

前提条件

步骤一:在AlbConfig中创建QUIC监听

  1. 执行以下命令编辑AlbConfig。

    kubectl edit albconfig <ALBCONFIG_NAME> # <ALBCONFIG_NAME>替换AlbConfig的名称
  2. 创建QUIC监听。

    apiVersion: alibabacloud.com/v1
    kind: AlbConfig
    metadata:
      name: #...
    spec:
      config:
        #...
      listeners:
        - port: 443
          protocol: QUIC # QUIC监听
          certificates:
          - CertificateId: 756****-cn-hangzhou # 证书的CertIdentifier
            IsDefault: true 
    重要

    以上示例使用了AlbConfig指定证书的配置方法。QUIC监听同样支持使用自动发现证书或Secret证书。具体操作,请参见配置HTTPS证书以实现加密通信

步骤二:创建示例资源

  1. 创建https-quickstart.yaml文件,并将以下内容拷贝到该文件中并保存。

    apiVersion: networking.k8s.io/v1
    kind: IngressClass
    metadata:
      name: https-ingressclass
    spec:
      controller: ingress.k8s.alibabacloud/alb
      parameters:
        apiGroup: alibabacloud.com
        kind: AlbConfig
        name: alb # 修改为AlbConfig资源的名称
    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: https-ingress
    spec:
      ingressClassName: https-ingressclass
      rules:
      - host: demo.alb.ingress.top # demo.alb.ingress.top替换为证书关联的域名
        http:
          paths:
          - backend:
              service:
                name: https-svc
                port:
                  number: 443
            path: /
            pathType: Prefix
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: https-deploy
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: https-deploy
      template:
        metadata:
          labels:
            app: https-deploy
        spec:
          containers:
            - image: registry.cn-hangzhou.aliyuncs.com/acs-sample/old-nginx:latest
              imagePullPolicy: IfNotPresent
              name: https-deploy
              ports:
                - containerPort: 80
                  protocol: TCP
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: https-svc
    spec:
      ports:
        - name: port1
          port: 443
          protocol: TCP
          targetPort: 80
      selector:
        app: https-deploy
      sessionAffinity: None
      type: ClusterIP
  2. 执行以下命令创建。

    kubectl apply -f https-quickstart.yaml

步骤三:在Ingress中添加注解

您需要在Ingress资源中添加注解,以保证Ingress适用于QUIC监听。

  1. 执行以下命令,编辑Ingress。

    kubectl edit ingress https-ingress
  2. 在Ingress中的annotations字段添加内容。

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: #...
      annotations:
        alb.ingress.kubernetes.io/listen-ports: '[{"QUIC": 443}]' # 使Ingress适用于QUIC监听
    spec:
      #...

步骤四:效果验证

  1. 执行以下命令,查看Ingress信息。

    kubectl get ingress

    预期输出:

    NAME            CLASS                HOSTS                  ADDRESS                         PORTS     AGE
    https-ingress   https-ingressclass   demo.alb.ingress.top   alb-********.alb.aliyuncs.com   80, 443   83m

    记录下HOSTSADDRESS部分的值,以便后续步骤使用。

  2. 执行以下命令,分别使用HTTP/3与传统的HTTPS访问服务。其中的demo.alb.ingress.topalb-********.alb.aliyuncs.com请替换为在上一步中得到的值。

    说明

    一部分curl版本并不默认支持使用HTTP/3协议,请确保您的curl支持HTTP/3。

    curl --http3 -H HOST:demo.alb.ingress.top -k https://alb-********.alb.aliyuncs.com

    预期输出如下,则表明QUIC监听配置成功:

    old

相关文档